package fiuba.algo3.algothief;

import java.util.ArrayList;





import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import java.util.Iterator;

public class Interpol {
	private Criminal criminal;
	private ArrayList<Criminal> criminales;
	private ArrayList<String> pelos;
	private ArrayList<String> senias;
	private ArrayList<String> sexos;
	private ArrayList<String> hobbies;
	private ArrayList<String> vehiculos;
	
	public Interpol (Criminal criminal){
		this.criminal = criminal;
		this.criminales = new ArrayList<Criminal>();
		this.pelos = new ArrayList<String>();
		this.senias = new ArrayList<String>();
		this.hobbies = new ArrayList<String>();
		this.sexos = new ArrayList<String>();
		this.vehiculos = new ArrayList<String>();
	}
	
	
	public ArrayList<String> filtrarCriminales(String sexo, String hobby, String cabello, String senia, String vehiculo){
		ArrayList<Criminal> criminalesFiltrados=new ArrayList<Criminal>();
		ArrayList<String> nombresDeCriminales=new ArrayList<String>();		
		for(int i=0;i<this.criminales.size();i++){
			criminalesFiltrados.add(this.criminales.get(i));
		}		
		if(sexo!=""){
			this.filtrarPorSexo(criminalesFiltrados,sexo);
		}
		if(hobby!=""){
			this.filtrarPorHobby(criminalesFiltrados,hobby);
		}
		if(cabello!=""){
			this.filtrarPorCabello(criminalesFiltrados,cabello);
		}
		if(senia!=""){
			this.filtrarPorSenia(criminalesFiltrados,senia);
		}
		if(vehiculo!=""){
			this.filtrarPorVehiculo(criminalesFiltrados,vehiculo);
		}		
		nombresDeCriminales=this.convertirAListaDeString(criminalesFiltrados);
		return nombresDeCriminales;
	}
	
	
	private ArrayList<String> convertirAListaDeString(ArrayList<Criminal> criminalesFiltrados) {
		ArrayList<String> devolucion=new ArrayList<String>();
		for(int i=0;i<criminalesFiltrados.size();i++){
			devolucion.add(criminalesFiltrados.get(i).getNombre());
		}
		return devolucion;
	}
	
	
	private void filtrarPorSexo(ArrayList<Criminal> criminalesFiltrados,String sexo) {
		Iterator<Criminal> i = criminalesFiltrados.iterator();
		while( i.hasNext()){
			if(sexo!=i.next().getSexo()){
				i.remove();
			}
		}
	}
	
	
	private void filtrarPorHobby(ArrayList<Criminal> criminalesFiltrados,String hobby) {
		Iterator<Criminal> i = criminalesFiltrados.iterator();
		while( i.hasNext()){
			if(hobby!=i.next().getHobby()){
				i.remove();
			}
		}
	}
	
	
	private void filtrarPorCabello(ArrayList<Criminal> criminalesFiltrados,String cabello) {
		Iterator<Criminal> i = criminalesFiltrados.iterator();
		while( i.hasNext()){
			if(cabello!=i.next().getCabello()){
				i.remove();
			}
		}
	}
	
	
	private void filtrarPorSenia(ArrayList<Criminal> criminalesFiltrados,String senia) {
		Iterator<Criminal> i = criminalesFiltrados.iterator();
		while( i.hasNext()){
			if(senia!=i.next().getSenia()){
				i.remove();
			}
		}
	}
	
	
	private void filtrarPorVehiculo(ArrayList<Criminal> criminalesFiltrados,String vehiculo) {
		Iterator<Criminal> i = criminalesFiltrados.iterator();
		while( i.hasNext()){
			if(vehiculo!=i.next().getVehiculo()){
				i.remove();
			}
		}
	}
	
	
	public boolean verificarSiEsElCriminalCorrecto(ArrayList<String> listaCriminales){
		boolean devolucion = false;
		if (listaCriminales.size() == 1){
		devolucion = (listaCriminales.get(0) == this.criminal.getNombre());
		}
		return devolucion;
	}
	
	
	private void setCriminal(Criminal criminal) {
		this.criminal = criminal;
	}
	
	
	public Element serializar(Document doc) {
		Element elementoInterpol = doc.createElement("Interpol");
		elementoInterpol.appendChild(this.criminal.serializar(doc));
		elementoInterpol.setAttribute("cantidadCriminales",Integer.toString(this.criminales.size()));
		elementoInterpol.setAttribute("cantidadPelos",Integer.toString(this.getCantidadDePelos()));
		elementoInterpol.setAttribute("cantidadSenias",Integer.toString(this.getCantidadDeSenias()));
		elementoInterpol.setAttribute("cantidadSexos",Integer.toString(this.getCantidadDeSexos()));
		elementoInterpol.setAttribute("cantidadHobbies",Integer.toString(this.getCantidadDeHobbies()));
		elementoInterpol.setAttribute("cantidadVehiculos",Integer.toString(this.getCantidadDeVehiculos()));
		Element elementoCriminales = doc.createElement("Criminales");
		elementoInterpol.appendChild(elementoCriminales);
		for (Criminal criminal : this.criminales) {
			elementoCriminales.appendChild(criminal.serializar(doc));
		}
		Element elementoPelos = doc.createElement("Pelos");
		elementoInterpol.appendChild(elementoPelos);
		int i=0;
		for (String pelo : this.pelos) {
			elementoPelos.setAttribute("pelo"+Integer.toString(i),pelo);
			i++;
		}
		Element elementoSenias = doc.createElement("Senias");
		elementoInterpol.appendChild(elementoSenias);
		i=0;
		for (String senia : this.senias) {
			elementoSenias.setAttribute("senia"+Integer.toString(i),senia);
			i++;
		}
		Element elementoSexos = doc.createElement("Sexos");
		elementoInterpol.appendChild(elementoSexos);
		i=0;
		for (String sexo : this.sexos) {
			elementoSexos.setAttribute("sexo"+Integer.toString(i),sexo);
			i++;
		}
		Element elementoHobbies = doc.createElement("Hobbies");
		elementoInterpol.appendChild(elementoHobbies);
		i=0;
		for (String hobby : this.hobbies) {
			elementoHobbies.setAttribute("hobby"+Integer.toString(i),hobby);
			i++;
		}
		Element elementoVehiculos = doc.createElement("Vehiculos");
		elementoInterpol.appendChild(elementoVehiculos);
		i=0;
		for (String vehiculo : this.vehiculos) {
			elementoVehiculos.setAttribute("vehiculo"+Integer.toString(i),vehiculo);
			i++;
		}
		return elementoInterpol;
	}
	
	
	public static Interpol hidratar(Node elementoInterpol) {
		Interpol nuevoInterpol = new Interpol(null);
		Element elementoCriminal = (Element)((Element)elementoInterpol).getElementsByTagName("Criminal").item(0);
		nuevoInterpol.setCriminal(Criminal.hidratar(elementoCriminal));
		int cantidadCriminales = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadCriminales"));
		int cantidadPelos = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadPelos"));
		int cantidadSenias = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadSenias"));
		int cantidadSexos = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadSexos"));
		int cantidadHobbies = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadHobbies"));
		int cantidadVehiculos = Integer.parseInt(((Element)elementoInterpol).getAttribute("cantidadVehiculos"));
		Element elementoCriminales = (Element)((Element)elementoInterpol).getElementsByTagName("Criminales").item(0);
		for (int i=0; i<cantidadCriminales; i++) {
			Criminal criminal = Criminal.hidratar(elementoCriminales.getChildNodes().item(i));
			nuevoInterpol.agregarCriminal(criminal);
		}
		ArrayList<String> pelos = new ArrayList<String>();
		Element elementoPelos = (Element)((Element)elementoInterpol).getElementsByTagName("Pelos").item(0);
		for (int i=0; i<cantidadPelos; i++) {
			pelos.add(elementoPelos.getAttribute("pelo"+Integer.toString(i)));
		}
		nuevoInterpol.setPelos(pelos);
		ArrayList<String> senias = new ArrayList<String>();
		Element elementoSenias = (Element)((Element)elementoInterpol).getElementsByTagName("Senias").item(0);
		for (int i=0; i<cantidadSenias; i++) {
			senias.add(elementoSenias.getAttribute("senia"+Integer.toString(i)));
		}
		nuevoInterpol.setSenias(senias);
		ArrayList<String> sexos = new ArrayList<String>();
		Element elementoSexos = (Element)((Element)elementoInterpol).getElementsByTagName("Sexos").item(0);
		for (int i=0; i<cantidadSexos; i++) {
			sexos.add(elementoSexos.getAttribute("sexo"+Integer.toString(i)));
		}
		nuevoInterpol.setSexos(sexos);
		ArrayList<String> hobbies = new ArrayList<String>();
		Element elementoHobbies = (Element)((Element)elementoInterpol).getElementsByTagName("Hobbies").item(0);
		for (int i=0; i<cantidadHobbies; i++) {
			hobbies.add(elementoHobbies.getAttribute("hobby"+Integer.toString(i)));
		}
		nuevoInterpol.setHobbies(hobbies);
		ArrayList<String> vehiculos = new ArrayList<String>();
		Element elementoVehiculos = (Element)((Element)elementoInterpol).getElementsByTagName("Vehiculos").item(0);
		for (int i=0; i<cantidadVehiculos; i++) {
			vehiculos.add(elementoVehiculos.getAttribute("vehiculo"+Integer.toString(i)));
		}
		nuevoInterpol.setVehiculos(vehiculos);
		return nuevoInterpol;
	}
	
	
	private void agregarCriminal(Criminal criminal) {
		this.criminales.add(criminal);
	}
	
	
	public void setPelos(ArrayList<String> pelosCriminales) {
		this.pelos = pelosCriminales;		
	}
	
	
	public void setSexos(ArrayList<String> sexosCriminales) {
		this.sexos = sexosCriminales;	
	}
	
	
	public void setHobbies(ArrayList<String> hobbiesCriminales) {
		this.hobbies = hobbiesCriminales;		
	}
	
	
	public void setSenias(ArrayList<String> seniasCriminales) {
		this.senias = seniasCriminales;		
	}
	
	
	public void setVehiculos(ArrayList<String> vehiculosCriminales) {
		this.vehiculos = vehiculosCriminales;		
	}

	public void setCriminales(ArrayList<Criminal> criminales) {
		this.criminales=criminales;
	}

	
	public String getSexo(int i) {
		return sexos.get(i);
	}
	

	public int getCantidadDeSexos() {
		return sexos.size();
	}
	
	
	public String getPelo(int i) {
		return pelos.get(i);
	}

	
	public int getCantidadDePelos() {
		return pelos.size();
	}
	
	
	public String getSenia(int i) {
		return senias.get(i);
	}

	
	public int getCantidadDeSenias() {
		return senias.size();
	}
	
	
	public String getVehiculo(int i) {
		return vehiculos.get(i);
	}

	
	public int getCantidadDeVehiculos() {
		return vehiculos.size();
	}
	
	
	public String getHobby(int i) {
		return hobbies.get(i);
	}
	

	public int getCantidadDeHobbies() {
		return hobbies.size();
	}
	
}
